
// if(true) {
//     let foo = 'zce'
//     console.log(foo)   //zce
// }
// console.log(foo)  //报错 foo 未定义

//---------------------------------------------------------

// for (var i = 0; i < 3; i++) {
//     for (var i = 0;i < 3; i++) {
//         console.log(i)  // 0   1   2
//     }
//     console.log('内层结束 i = ' + i)  //  内层结束 i = 3
// }
/** 外层声明了 i 之后内层又声明了 i 而且都使用的是 var 声明的全局变量
 所以内层声明的 i 覆盖了外层的 i。 */ 

// 如果使用let就不会出现上述情况

// for (var i = 0; i < 3; i++) {
//     for (let i = 0;i < 3; i++) {
//         console.log(i)
//     }
//     console.log('内层结束 i = ' + i) 
// }

//---------------------------------------------------------

// var elements = [{},{},{}]
// for(var i = 0; i < elements.length; i++){
//     elements[i].onclick = function () {
//         console.log(i)
//     }
// }
// elements[2].onclick()  // 3
// 使用var 声明的 变量i  循环结束时 i = 3 所以不管elements的哪个元素 打印的都是3

//---------------------------------------------------------

// for (let i = 0; i < 3; i++) {
//     let i = 'foo'   // foo  3遍 
//     // let声明的变量  在作用域内有效，所以两个i互相没关系
//     console.log(i)
// }

// let i = 0

// if (i > 3) {
//     let i = 'foo'
//     console.log(i)
// }

// i++

// if (i > 3) {
//     let i = 'foo'
//     console.log(i)
// }

// i++

// if (i > 3) {
//     let i = 'foo'
//     console.log(i)
// }

// i++

//---------------------------------------------------------

// var声明变量  会把变量提升到 代码最开始位置 
// console.log(foo) //undefined   说明在打印时 变量已经被声明但是还没被定义
// var foo = 1

// let 从语法上就要求必须先声明变量再使用，要不然就会报出 变量未声明的错误

// console.log(foo) //报错
// let foo = 1


// const 和let的区别就是 const 只读
// 不能被修改初始内存指向

// const name = 'zce'
// name = jack  错误

// const obj = {}
// obj.name = 'zce'


